package com.agenda.server.net;

import java.io.InputStream;
import java.net.Socket;
import java.net.SocketException;
import com.agenda.comum.ReceberInformacao;
import com.agenda.controller.ChatController;
import com.agenda.model.RequisicaoEnum;
import com.agenda.model.Usuario;
import com.agenda.server.Servidor;
import com.agenda.server.listeners.UsuarioLogouListener;
import com.agenda.server.recebedores.LoginRecebedor;

public class RequisicaoThread implements Runnable, UsuarioLogouListener {

	private Socket sck;
	private Usuario usuario;

	public RequisicaoThread(Socket sck) {
		super();
		this.sck = sck;
	}

	@Override
	public void run() {
		while (sck != null && !sck.isClosed() && !sck.isInputShutdown()) {
			try {
				InputStream input = sck.getInputStream();

				int requisicao = input.read();
				System.out.println("Requisição que veio do cliente " + sck + " ReqNumero = " + requisicao);
				RequisicaoEnum requisicaoEnum = RequisicaoEnum.criarEnum(requisicao);

				System.out.println("Requisição que veio do cliente " + sck + " Req = " + requisicaoEnum);
				ReceberInformacao recebedor = Servidor.getRecebedor(requisicaoEnum);

				if (recebedor instanceof LoginRecebedor) {
					LoginRecebedor loginRecebedor = (LoginRecebedor) recebedor;
					loginRecebedor.setUsuarioLogou(this);
				}

				recebedor.receber(sck);

				if (recebedor instanceof LoginRecebedor) {
					LoginRecebedor loginRecebedor = (LoginRecebedor) recebedor;
					loginRecebedor.setUsuarioLogou(null);
				}

				recebedor.enviarResposta(sck);

			} catch (SocketException e) {
				e.printStackTrace();
				Servidor.getInstancia().removerUsuarioOnLine(usuario);
				ChatController.getINSTANCE().liberarSala(usuario);
				break;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}
